/**
  Copyright (c) [2024] [JiangNan]
  [simple-go-test] is licensed under Mulan PSL v2.
  You can use this software according to the terms and conditions of the Mulan PSL v2.
  You may obtain a copy of Mulan PSL v2 at:
           http://license.coscl.org.cn/MulanPSL2
  THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
  See the Mulan PSL v2 for more details.
*/

package tools

import (
	"errors"
	"strings"
	"unicode"
)

func ContainsAndDelete(s *[]string, str string) bool {
	item := *s
	for i, s2 := range item {
		if s2 == str {
			*s = append(item[:i], item[i+1:]...)
			return true
		}
	}
	return false
}

func AnyToString(a []any) []string {
	var result []string
	for _, v := range a {
		result = append(result, v.(string))
	}
	return result
}

func MapCopy[M1 interface{ ~map[K]V }, M2 interface{ ~map[K]V }, K comparable, V any](dst M1, src M2) {
	for k, v := range src {
		dst[k] = v
	}
}

// TrimLine 辅助函数：去除前缀并修剪空白
func TrimLine(s, prefix string) string {
	trimmed := strings.TrimPrefix(s, prefix)
	return strings.TrimSpace(trimmed)
}

// isNumeric 检查字符串 s 是否全部由数字组成。
// 该函数通过遍历字符串中的每个字符来判断是否为数字。
// 如果遇到非数字字符，则返回 false，表示字符串不是全数字。
// 如果所有字符都是数字，则返回 true。
func isNumeric(s string) bool {
	// 遍历字符串 s 的每一个字符
	for _, r := range s {
		// 使用 unicode 包的 IsDigit 函数判断字符 r 是否为数字
		if !unicode.IsDigit(r) {
			// 如果字符 r 不是数字，则返回 false
			return false
		}
	}
	// 如果所有字符都是数字，则返回 true
	return true
}

// FindStringFromMapAny 从 map[string]any 中查找多个字符串。
func FindStringFromMapAny(dst map[string]any, keys ...string) ([]string, error) {
	var result []string
	var notFound []string
	for _, key := range keys {
		if value, ok := dst[key]; ok {
			result = append(result, value.(string))
		} else {
			result = append(result, "")
			notFound = append(notFound, key)
		}
	}
	var err error
	if len(notFound) > 0 {
		err = errors.New("not found: " + strings.Join(notFound, ", "))
	}
	return result, err
}
